package cn.melonlib.cores.commons.comp.service;

import cn.melonlib.cores.commons.model.entity.IEntity;
import cn.melonlib.cores.jpa.comp.Dao;
import cn.melonlib.cores.jpa.model.bean.PersistenceResult;
import cn.melonlib.cores.jpa.model.bean.Query;

import java.io.Serializable;
import java.util.function.Function;

/**
 * 基础Service
 */
public interface BasicService {

    /**
     * 查询
     */
    <DATA> PersistenceResult<DATA> search(Query query) throws Exception;

    /**
     * 查询
     * @param query 查询对象
     * @param transform 结果数据转换器
     * @param <ENTITY> 查询模板类型
     * @param <DATA> 查询结果类型
     * @return 查询结果对象
     * @throws Exception 抛出异常并回滚事务
     */
    <ENTITY,DATA> PersistenceResult<DATA> search(Query query, Function<ENTITY, DATA> transform) throws Exception;

    <ENTITY extends IEntity<PK>,PK extends Serializable> ENTITY getEntity(Class<ENTITY> entityClass,PK id);

    /**
     * 数据更新操作
     * @param worker 更新回调
     * @return
     */
    PersistenceResult<Integer> updateWork(Function<Dao,Integer> worker);

    /**
     * 数据查询操作
     * @param worker 查询回调
     * @param <DATA> 查询结果模板
     * @return 查询结果
     */
    <DATA> PersistenceResult<DATA> queryWork(Function<Dao, DATA> worker);

    /**
     * 保存对象
     */
    <ENTITY extends IEntity<? extends Serializable>> PersistenceResult<ENTITY> save(ENTITY entity) throws Exception;

    /**
     * 保存对象
     * @param entity 需要保存的对象
     * @param before 保存前置操作
     * @param post 保存后置操作
     * @param <ENTITY> 对象模板
     * @return 保存的实体对象(包含主键值)
     * @throws Exception 出现任何异常抛出并回滚事务
     */
    <ENTITY extends IEntity<? extends Serializable>> PersistenceResult<ENTITY> save(ENTITY entity,UpdateHandler<ENTITY,Integer> before,UpdateHandler<ENTITY,Integer> post) throws Exception;

    /**
     * 删除对象

     */
    <ENTITY extends IEntity<? extends Serializable>> PersistenceResult<Integer> remove(ENTITY entity) throws Exception;

    /**
     * 删除对象
     * @param entity 需要删除的对象
     * @param before 删除前置操作
     * @param post 删除后置操作
     * @param <ENTITY> 删除对象的模板
     * @return 影响数据的个数
     * @throws Exception 出现任何异常抛出并回滚事务
     */
    <ENTITY extends IEntity<? extends Serializable>> PersistenceResult<Integer> remove(ENTITY entity,UpdateHandler<ENTITY,Integer> before,UpdateHandler<ENTITY,Integer> post) throws Exception;

    /**
     * 通过ID删除对象
     */
    <ENTITY extends IEntity<? extends Serializable>> PersistenceResult<Integer> removeById(Class<ENTITY> entityClass, String id) throws Exception;
    /**
     * 通过ID删除对象
     */
    <ENTITY extends IEntity<? extends Serializable>> PersistenceResult<Integer> removeById(Class<ENTITY> entityClass, String id
            ,UpdateHandler<String,Integer> before,UpdateHandler<ENTITY,Integer> post) throws Exception;


}
